const fs = require('fs');
const path = require('path');

const cwd = process.cwd();

function getProjectPath(...filePath) {
    return path.join(cwd, ...filePath);
}

function resolve(moduleName) {
    return require.resolve(moduleName);
}

// We need hack the require to ensure use package module first
// For example, `typescript` is required by `gulp-typescript` but provided by `antd`
// we do not need for ant-design-vue
let injected = false;
function injectRequire() {
    if (injected) return;

    const Module = require('module');

    const oriRequire = Module.prototype.require;
    Module.prototype.require = function (...args) {
        const moduleName = args[0];
        try {
            return oriRequire.apply(this, args);
        } catch (err) {
            const newArgs = [...args];
            if (moduleName[0] !== '/') {
                newArgs[0] = getProjectPath('node_modules', moduleName);
            }
            return oriRequire.apply(this, newArgs);
        }
    };

    injected = true;
}

function getConfig() {
    const configPath = getProjectPath('.tools.config.js');
    if (fs.existsSync(configPath)) {
        return require(configPath);
    }

    return {};
}

/**
 * 是否存在可用的browserslist config
 * https://github.com/browserslist/browserslist#queries
 * @returns
 */
function isThereHaveBrowserslistConfig() {
    try {
        const packageJson = require(getProjectPath('package.json'));
        if (packageJson.browserslist) {
            return true;
        }
    } catch (e) {
        //
    }
    if (fs.existsSync(getProjectPath('.browserslistrc'))) {
        return true;
    }
    if (fs.existsSync(getProjectPath('browserslist'))) {
        return true;
    }
    // parent项目的配置支持，需要再补充
    // ROWSERSLIST ROWSERSLIST_ENV 变量的形式，需要再补充。
    return false;
}

module.exports = {
    getProjectPath,
    resolve,
    injectRequire,
    getConfig,
    isThereHaveBrowserslistConfig,
};
